iT邦幫忙

2025 iThome 鐵人賽

DAY 10
2

讀書進度順利過半,已經到第五章節 —— Implementations!下午幫朋友慶生大快朵頤,現在整個人昏昏欲睡。難得的快樂假日,就稍微休息一下,簡單做個閱讀筆記吧。

26. Postpone variable definitions as long as possible

在 C++ 中,定義變數時會產生構造開銷析構開銷。即使變數沒有被使用,這些開銷在拋出異常時依然可能浪費資源。為了優化效能應盡量推遲變數定義,直到真的需要它的時候,並避免定義未使用的變數。在構造時直接賦值可提高效率,亦能增加程式的可讀性。

對於迴圈的變數宣告,則分為兩種情況,其分別的成本如下。

  • 外部:1 個 constructor、1 個 desctructor、n 個 assign。在 n 較大時高效。
  • 內部:n 個 constructor、n 個 desctructor。更容易維護,通常默認使用此方法。

27. Minimize casting

型別轉換可能破壞 C++ 的類型安全性,增加程式碼的風險和複雜性。尤其是 dynamic_cast 在執行時會消耗額外的性能。若有需要進行型別轉換,最好將其封裝在函式內,以減少對外部程式碼的影響。避免使用 C 風格的類型轉換。

C++ 有另外三種常見的型別轉換,其各自有潛在的安全風險。

  • static_cast:用於大多數明確的型別轉換。若發生在編譯階段,不會做執行階段檢查。
    • 基本資料型別之間的互相轉換。
    • void* 轉為具類型指標。
    • non-const 轉為 const
  • const_cast:唯一可移除 constvolatile 限定符的轉換方式,常用於將 const 傳給 non-const 的函式。
  • reinterpret_cast:用於非常底層且具有危險的指標轉換,如 int* 轉為 char* 等。幾乎無檢查機制,且轉換結果不一定有意義。

28. Avoid returning "handles" to object internals

返回指向內部成員的 handle 會破壞封裝性,這等同於讓外部程式碼直接操作物件的內部狀態。即使成員函數聲明為 const,返回的 handle 仍可能允許修改內部變數,造成數值不一致且難以追蹤。舉例來說,若 handle 為指標:

class YoyoScore {
private:
    int value;
public:
    int* getValue() { return &value; }
};

此外,應避免返回指向暫時物件的 handle,避免因生命週期較短導致的 dangling handle 問題。


上一篇
[Day 9] 中場休息 Q&A小測驗!!
下一篇
[Day 11] Implementations II
系列文
30 天 Effective C++ 大挑戰!!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言